home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GME / GMEDITOR.I < prev    next >
Encoding:
Text File  |  1991-03-09  |  36.1 KB  |  3 lines

  1. ⓪ (* Portierung auf MM2: 9. 6. 89 *)⓪ (* Stand 10. 12. 90 *)⓪ ⓪ (*⓪"17.1.90: TT  MainOutputPath & CompilerParm.name beim Compiler-Call⓪/ausgewertet⓪#6.3.90: TT  CompilerArgs an Compiler übergeben⓪"29.7.90: TT  $Y+ Direktive eingefügt, $J- entfernt⓪!13.12.90: TT  Damit nach Compile-Lauf im GME der Text ein File-Datum⓪/erhählt, das das Make zufriedenstellt, wird die Zeit VOR⓪/dem Compiler-Aufruf verwendet.⓪ *)⓪ ⓪ IMPLEMENTATION MODULE GMEditor;⓪ ⓪ (* The Little Golem Editor. Begonnen 13. 06. 86⓪#(C) 1986, 1987, 1988 by Johannes Leckebusch.⓪#(C) 1989, 1990 by Johannes Leckebusch.⓪ *)⓪ ⓪ (*$R-*)⓪ (*$Z+*)⓪ (*$Y+ (sonst geht Compile nicht!) *)⓪ ⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADR, ADDRESS;⓪ IMPORT StrConv, Loader, Paths, ShellMsg, TimeConvert, Clock, Lists;⓪ (* FROM Storage IMPORT Inconsistent; *)⓪ FROM EasyGEM1 IMPORT ClearScrap;⓪ ⓪ (* FROM MyConversions IMPORT ConvCard; *)⓪ FROM Convert IMPORT ConvCard;⓪ ⓪ IMPORT Strings;⓪ IMPORT Directory;⓪ ⓪ FROM FastStrings IMPORT Append, Assign, Copy, Delete, Length,⓪6Insert, Pos;⓪ ⓪ FROM GMEBase IMPORT nul, backspace, CharsInLine, tab, LinesOnScreen,⓪7linedel, lineins,⓪7WriteChar, WriteLn, WriteConst, Trace,⓪7LoescheBild, LoescheZeile, GotoXY,⓪7(* CursorEin, *) CursorAus, HighLight, Normal,⓪7Left, Right, ButtonSet, MausPos, MausDoppel,⓪7MausAus, MausEin, MausBusy, Nachricht,⓪7FrageJaNein, Ja, Nein, Abbruch,⓪7CharWidth, CharHeight, ScreenWidth, ScreenHeight;⓪ ⓪ FROM GMEBase IMPORT einBefehl, Befehlssatz;⓪ FROM GMEConfig IMPORT einTasteneintrag, einTastenTyp, LiesZeichen,⓪(CopyConfig;⓪ ⓪ FROM GMEBase IMPORT UndoPuffer, ClipBoard, HilfsPuffer, ConfigPuffer,⓪(EditPuffer, AlternEdit, FehlerPuffer, MailPuffer, GolemPuffer,⓪(Tausch, SendePuffer, PSCPuffer, WaehlPuffer, undone,⓪(DruckPuff, StartPuffer;⓪ ⓪ FROM GMEBase IMPORT cZeile;⓪ ⓪ FROM GMEBase IMPORT eineZeile, eineInfo, einLinePointer, aLine,⓪5einStringPointer,⓪5einPufferPointer, einMerkPunkt, MerkIndex, einMerkPointer,⓪5einPufferDeskriptor, Mode,⓪5Moden, CharSet;⓪ ⓪ FROM GMEBase IMPORT Loeschen, DeletePuffer, PufferLeer,⓪5GetLine, PutLine,⓪5FindeLeerpuffer, InsertPuffer, AutoCount;⓪ ⓪ FROM GMEKernel IMPORT WriteString, SchirmSchreiben,⓪7InsertZeile, tabjump;⓪ ⓪ FROM GMEFile IMPORT SaveConfig, LoadConfig;⓪ ⓪ FROM GMEKernel IMPORT Edit, Prompt;⓪ ⓪ FROM GMEKernel IMPORT SucheZeilenPointer, StelleZeileEin, StellePointerEin,⓪7SucheZeilenNummer, LineDown, LineUp,⓪7DeleteLine, InsertLine, ScrollDown, ScrollUp,⓪7DoBackspace, DoDelete, DoCR;⓪ ⓪ FROM GMEKernel IMPORT SucheWort, TauscheWort, GetKey, ReadNum,⓪(InBlockMarken, BlockMarkiert, KopiereLoesche, Kopiere,⓪(MarkiereBlockAnfang, MarkiereBlockEnde, LoescheBlockMarken,⓪(RueckeBlockEin, LoeschePuffer;⓪ ⓪ (* FROM EditLook IMPORT SuchwortHolen, WortSuchen, SuchTauschen; *)⓪ ⓪ FROM GMEBase IMPORT DeleteTail, DoClipboard;⓪ ⓪ FROM GMEFile IMPORT TextSchreiben, TextLesen;⓪ ⓪ FROM GMEFile IMPORT ScrapPfad, ScrapName, SetCompilerInfo;⓪ ⓪ CONST   coffset =               16;⓪ ⓪ VAR     scrolloffset:           CARDINAL;⓪(dummy:                  CHAR;⓪(befehl:                 einBefehl;⓪(key:                    einTasteneintrag;⓪(version:                eineInfo;⓪(suchwort:               eineZeile;⓪(tauschwort:             eineZeile;⓪(Zeile:                  eineZeile;⓪(dummyC, dummyCC:        CARDINAL;⓪(mx, my, oldmx, oldmy:   CARDINAL;⓪(Knoepfe:                ButtonSet;⓪(bewegt:                 BOOLEAN;⓪(SelectMenue,⓪(SelectEintrag:          CARDINAL;⓪(LoeschPfad, LoeschName: eineInfo;⓪(DummySuff:              ARRAY [0..3] OF CHAR;⓪(result:                 INTEGER;⓪(returnX:                CARDINAL;⓪(VollPrompt:             BOOLEAN;⓪(BlockWurdeMarkiert:     BOOLEAN;⓪ ⓪ VAR compLine: einLinePointer;⓪$compEOF: CHAR;⓪ ⓪ ⓪ (* die folg. Prozedur muß global sein! *)⓪ ⓪ (*$Z-*)⓪ PROCEDURE doCompilerLine (): einStringPointer;⓪"(*$L-*)⓪"BEGIN⓪$(*⓪&compLine:= compLine^.naechste;⓪&IF compLine # NIL THEN⓪(p:= compLine^.ZeilPointer;⓪&ELSE⓪(compEOF:= 3C;⓪(p:= ADR (compEOF)⓪&END;⓪&RETURN p⓪$*)⓪$ASSEMBLER⓪(LEA     compLine,A0⓪(MOVE.L  (A0),A1⓪(MOVE.L  compLine.naechste(A1),A1⓪(MOVE.L  A1,(A0)⓪(BEQ     atEOF⓪ ⓪(MOVE.L  compLine.ZeilPointer(A1),(A3)+⓪(RTS⓪ ⓪&atEOF⓪(MOVE.B  #$03,compEOF⓪(MOVE.L  #compEOF,(A3)+⓪$END;⓪"END doCompilerLine;⓪"(*$L=*)⓪ (*$Z+*)⓪ ⓪ (*************************** Aus EditLook ***********************)⓪ ⓪ (*********** Alte Suchroutinen, die frueher in Editor.MOD waren: ****)⓪ CONST   PhantomTrenn =          37C; (* Arghhh! Sollte importiert werden... *)⓪ VAR     TrennSet, BindeSet:     CharSet;⓪ ⓪ PROCEDURE SuchwortHolen (Puff: einPufferPointer; VAR suchwort: ARRAY OF CHAR);⓪ VAR   ind, off:               CARDINAL;⓪&switch, warBlank:       BOOLEAN;⓪ ⓪"(* Aus Editline, abgeaendert!: *)⓪"PROCEDURE SkipBlank (ch: CHAR): BOOLEAN;⓪"BEGIN⓪$switch := warBlank;⓪$warBlank := warBlank OR (ch IN TrennSet);⓪$IF warBlank & (ch # ' ') & switch THEN⓪&warBlank := FALSE;⓪&switch := FALSE;⓪&RETURN FALSE; (* Cursor bleibt stehen *)⓪$ELSE RETURN TRUE; (* Cursor läuft weiter *)⓪$END (* IF *);⓪"END SkipBlank;⓪"⓪ BEGIN (* SuchwortHolen *)⓪"suchwort [0] := nul;⓪"WITH Puff^.MerkPunkte [LaufendeZeile] DO⓪$ind := 0; off := 0; warBlank := FALSE;⓪$IF (merkline^.ZeilPointer^ [ind + charpos] IN TrennSet) THEN⓪&WHILE SkipBlank (merkline^.ZeilPointer^ [ind + charpos]) DO⓪(INC (ind); INC (off);⓪&END;⓪$END (* IF *);⓪$IF charpos + ind < Length (merkline^.ZeilPointer^) THEN⓪&WHILE (SkipBlank (merkline^.ZeilPointer^ [ind + charpos])) &⓪,(merkline^.ZeilPointer^ [ind + charpos] # ' ') DO⓪(suchwort [ind - off] := merkline^.ZeilPointer^ [ind + charpos];⓪(INC (ind);⓪&END (* WHILE *);⓪&IF (ind > 0) & (merkline^.ZeilPointer^ [ind - 1 + charpos] IN⓪+TrennSet - CharSet {' '})⓪(THEN DEC (ind);⓪&END (* IF *);⓪$END (* IF *);⓪$suchwort [ind - off] := nul;⓪"END (* WITH *);⓪ END SuchwortHolen;⓪!⓪ PROCEDURE WortSuchen (Puff: einPufferPointer;⓪6holen: BOOLEAN; VAR suchwort: ARRAY OF CHAR);⓪ VAR   repeat:           CARDINAL;⓪&s:                CharSet;⓪&m:                eineInfo;⓪&gefunden:         BOOLEAN;⓪&ersterFund:       BOOLEAN;⓪&IndexAbfrage:     BOOLEAN;⓪&ok:               BOOLEAN;⓪ VAR   ml, mp, hp:       einMerkPointer;⓪&(* dummy,dummy1, scd, *)⓪&ch, ch1:          CHAR;⓪&key:              einTasteneintrag;⓪ BEGIN⓪"IF holen THEN SuchwortHolen (Puff, suchwort);⓪"(* ELSE suchwort [0] := nul; *)⓪"END;⓪"IF WortSuche IN Puff^.Modus THEN⓪$Prompt (1, 'Suche Wort (ESC löscht Vorgabe, leeres Wort bricht ab): ',⓪*suchwort, key);⓪"ELSE⓪$Prompt (1, 'Suche Muster (ESC löscht Vorgabe, leeres Muster bricht ab): ',⓪*suchwort, key);⓪"END (* IF *);⓪"(* tauschwort := ''; *)⓪"IF ~(suchwort [0] = nul) THEN⓪"⓪$s := CharSet {'E', 'N', 'L', 'Q'}; (* Konstante einsetzen funkt. nicht *)⓪$ch := 'E';⓪$GetKey (2, 'E(inmal, N(mal, L(etztes suchen oder Q(uit: ', s, ch);⓪$IF ch = 'Q' THEN⓪&SchirmSchreiben (Puff, Puff^.MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪&RETURN;⓪$END (* IF Quit *);⓪$IF ch = 'N' THEN⓪&repeat := 1;⓪&ReadNum (3, 'Anzahl: ', repeat);⓪&IF repeat = 0 THEN RETURN; END;⓪$ELSE repeat := 1;⓪$END (* IF *);⓪$ersterFund := TRUE;⓪$IF holen THEN⓪&WITH Puff^ DO⓪(WITH MerkPunkte [LetztePosition] DO⓪*zeilpos := MerkPunkte [LaufendeZeile].zeilpos;⓪*charpos := MerkPunkte [LaufendeZeile].charpos;⓪*merkline := MerkPunkte [LaufendeZeile].merkline;⓪(END (* WITH *);⓪&END (* WITH Puff^ *);⓪&StelleZeileEin (Puff, 1, 0);⓪$END (* IF holen *);⓪$REPEAT⓪&MausBusy;⓪&SucheWort (Puff, suchwort, gefunden, key);⓪&IF ch IN CharSet {'E', 'N'} THEN DEC (repeat);⓪(IF ~gefunden THEN⓪*Strings.Assign ('>>', m, ok); Append (suchwort, m);⓪*Strings.Append ('<<|nicht gefunden!', m, ok);⓪*Nachricht (m);⓪(END (* IF ~gefunden *);⓪&END (* IF dummy *);⓪$UNTIL (ch = 'E') OR ~gefunden OR (repeat = 0);⓪"END (* IF *);⓪"IF gefunden THEN⓪$WITH Puff^ DO⓪&WITH MerkPunkte [IndexListe] DO⓪(zeilpos := MerkPunkte [LaufendeZeile].zeilpos;⓪(merkline := MerkPunkte [LaufendeZeile].merkline;⓪(charpos := MerkPunkte [LaufendeZeile].charpos;⓪&END (* WITH *);⓪$END (* WITH Puff^ *);⓪"END (* IF gefunden *);⓪"Normal;⓪"SchirmSchreiben (Puff, Puff^.MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪ END WortSuchen;⓪ ⓪ PROCEDURE SuchTauschen (Puff: einPufferPointer; holen: BOOLEAN;⓪8VAR suchwort, tauschwort: ARRAY OF CHAR);⓪ VAR   repeat:           CARDINAL;⓪&dummy:            einTasteneintrag;⓪&ch, ch1:          CHAR;⓪&key:              einTasteneintrag;⓪&s:                CharSet;⓪&gefunden:         BOOLEAN;⓪ BEGIN⓪"IF holen THEN SuchwortHolen (Puff, suchwort);⓪"(* ELSE suchwort [0] := nul; *)⓪"END;⓪"WITH Puff^ DO⓪$IF WortSuche IN Modus THEN⓪&Prompt (1,⓪!'Suchen & Tauschen: Suchwort (ESC löscht Vorgabe, leeres Wort bricht ab): ',⓪,suchwort, key);⓪$ELSE⓪&Prompt (1,⓪ 'Suchen & Tauschen: Suchmuster (ESC löscht Vorgabe, leeres Muster bricht ab): ',⓪,suchwort, key);⓪$END (* IF *);⓪$IF ~(suchwort [0] = nul) THEN⓪&IF (tauschwort [0] = nul) THEN Assign (suchwort, tauschwort); END;⓪&Prompt (2, 'Austauschwort (ESC löscht Vorgabe): ', tauschwort, key);⓪&s := CharSet {'E', 'N', 'F', 'A', 'Q'};⓪&ch := 'E';⓪&GetKey (3, 'E(inmal, N(mal, F(ragen nmal, A(lle tauschen, Q(uit: ', s, ch);⓪&IF ch = 'Q' THEN⓪(SchirmSchreiben (Puff, MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪(RETURN;⓪&END (* IF Quit *);⓪&IF ch IN CharSet {'N', 'F'} THEN⓪(repeat := 1;⓪(ReadNum (4, 'Anzahl (0 für alle): ', repeat);⓪(IF repeat = 0 THEN repeat := 65000; END;⓪&ELSE repeat := 1;⓪&END (* IF *);⓪&REPEAT⓪(MausBusy;⓪(SucheWort (Puff, suchwort, gefunden, key);⓪(IF (ch IN CharSet {'E', 'N', 'F'})⓪(THEN DEC (repeat);⓪(END (* IF *);⓪*IF gefunden THEN⓪,INCL (Modus, Editiert);⓪,IF ch = 'F' THEN⓪.SchirmSchreiben (Puff, MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪.GotoXY (0, 0); LoescheZeile; HighLight;⓪.WriteConst ('Tauschen J/N/Ende: '); Normal;⓪.GotoXY (MerkPunkte [LaufendeZeile].charpos -⓪8MerkPunkte [ErsteZeile].charpos,⓪6MerkPunkte [LaufendeZeile].zeilpos -⓪8MerkPunkte [ErsteZeile].zeilpos);⓪.REPEAT LiesZeichen (ch1); ch1 := CAP (ch1);⓪.UNTIL ch1 IN CharSet {'J', 'N', 'E'};⓪,ELSE ch1 := 'J'; WriteChar ('.');⓪,END (* IF *);⓪,IF ch1 = 'J' THEN⓪.TauscheWort (Puff, suchwort, tauschwort, Max, dummy);⓪,ELSIF ch1 = 'E' THEN gefunden := FALSE;⓪,END (* IF *);⓪*END (* IF gefunden *);⓪&UNTIL (ch = 'E') OR ~gefunden OR (repeat = 0);⓪$END (* IF *);⓪$IF gefunden THEN⓪&WITH MerkPunkte [IndexListe] DO⓪(zeilpos := MerkPunkte [LaufendeZeile].zeilpos;⓪(merkline := MerkPunkte [LaufendeZeile].merkline;⓪(charpos := MerkPunkte [LaufendeZeile].charpos;⓪&END (* WITH *);⓪$END (* IF gefunden *);⓪$SchirmSchreiben (Puff, MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪"END (* WITH *);⓪ END SuchTauschen;⓪ ⓪ (**************************** ENDE EditLook ****************************)⓪ ⓪ ⓪ PROCEDURE CheckMargin (Puff: einPufferPointer);⓪ VAR   Cursor, Offset, dec:     CARDINAL;⓪ BEGIN⓪"WITH Puff^ DO⓪$Cursor := MerkPunkte [LaufendeZeile].charpos;⓪$Offset := MerkPunkte [ErsteZeile].charpos;⓪ ⓪$IF Cursor < Offset THEN (* es war die linke Grenze: *)⓪&dec := ((Offset - Cursor) DIV scrolloffset + 1) * scrolloffset;⓪&IF MerkPunkte [ErsteZeile].charpos > dec THEN⓪(DEC (MerkPunkte [ErsteZeile].charpos, dec)⓪&ELSE MerkPunkte [ErsteZeile].charpos := 0;⓪&END (* IF *);⓪$ELSIF Cursor >= Offset + CharsInLine (* es war die rechte Grenze: *) THEN⓪&dec := ((Cursor - Offset) DIV scrolloffset + 1) *⓪/scrolloffset - CharsInLine;⓪&INC (MerkPunkte [ErsteZeile].charpos, dec);⓪$END (* IF globalx <> xoffset *);⓪"END (* WITH *);⓪ END CheckMargin;⓪ ⓪ PROCEDURE CallCompiler (puff: einPufferPointer; VAR msg: ARRAY OF CHAR);⓪"(*⓪#* IN: puff⓪#* OUT: msg  (enthält Fehlermeldung, sonst leer)⓪#*)⓪ ⓪"VAR ok: BOOLEAN; ex: INTEGER; res: Loader.LoaderResults;⓪&n: CARDINAL; arg: ARRAY [0..125] OF CHAR;⓪&drivers: Lists.List;⓪&tagzeit, dat: CARDINAL;⓪"BEGIN⓪$GotoXY (0, 0); HighLight;⓪$WriteConst ('Compiler läuft...'); LoescheZeile; Normal;⓪$ShellMsg.ScanMode:= FALSE;⓪$compLine:= puff^.Puffer;⓪$Strings.Concat (puff^.Name, ' /Q /^', arg, ok);⓪$Strings.Append (StrConv.LHexToStr (ADDRESS (doCompilerLine),0), arg, ok);⓪$IF ShellMsg.MainOutputPath[0] # 0C THEN⓪&Strings.Append (' /O', arg, ok);⓪&Append (ShellMsg.MainOutputPath, arg);⓪$END;⓪$IF ShellMsg.CompilerArgs[0] # 0C THEN⓪&Strings.Append (' ', arg, ok);⓪&Append (ShellMsg.CompilerArgs, arg);⓪$END;⓪$(* Zeit muß VOR Compiler-Aufruf gemerkt werden! *)⓪$tagzeit:= Clock.PackTime (Clock.CurrentTime ());⓪$dat:= Clock.PackDate (Clock.CurrentDate ());⓪$MausBusy;⓪$Loader.CallModule (ShellMsg.CompilerParm.name, ShellMsg.StdPaths,⓪7arg, NIL, ex, msg, res);⓪$IF res = Loader.noError THEN⓪&CASE ex OF⓪(0:   Strings.Upper (ShellMsg.CodeName);⓪-Assign (ShellMsg.CodeName, msg);⓪-Strings.Append ('   Länge: ', msg, ok);⓪-Strings.Append (StrConv.CardToStr (ShellMsg.CodeSize, 0),⓪=msg, ok);⓪-WITH puff^ DO⓪/tageszeit := tagzeit;⓪/datum := dat;⓪/INCL (Modus, Compiliert);⓪-END (* WITH *);⓪(|⓪(2,3: StelleZeileEin (puff, ShellMsg.TextLine, LinesOnScreen DIV 2);⓪-n:= Length⓪2(puff^.MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^) + 1;⓪-IF ShellMsg.TextCol > n THEN ShellMsg.TextCol:= n END;⓪-puff^.MerkPunkte [LaufendeZeile].charpos := ShellMsg.TextCol-1;⓪-CheckMargin (puff);⓪-Strings.Assign (ShellMsg.ErrorMsg, msg, ok);⓪-(*⓪-WITH puff^.MerkPunkte [CompilerInfo] DO⓪/zeilpos := puff^.MerkPunkte [LaufendeZeile].zeilpos;⓪/merkline := puff^.MerkPunkte [LaufendeZeile].merkline;⓪/charpos := puff^.MerkPunkte [LaufendeZeile].charpos;⓪/PutLine (merkinfo, msg);⓪-END (* WITH *);⓪-*)⓪(|⓪(4:   Strings.Assign ('Include-Dateien sind hier nicht erlaubt!',⓪=msg, ok)⓪(|⓪&ELSE⓪-Strings.Assign ('Unbekannte Antwort vom Compiler', msg, ok);⓪&END⓪$ELSE⓪&(* Fehler in 'msg' anzeigen lassen *)⓪$END;⓪$SetCompilerInfo (puff, msg);⓪"END CallCompiler;⓪ ⓪ PROCEDURE ZeitAnzeigen (Puff: einPufferPointer; VAR msg: ARRAY OF CHAR);⓪ VAR     str:            ARRAY [0..13] OF CHAR;⓪(ok:             BOOLEAN;⓪ BEGIN⓪"Assign ('Datum: ', msg);⓪"TimeConvert.DateToText (Clock.UnpackDate (Puff^.datum), '', str);⓪"Append (str, msg);⓪"Append (', Zeit: ', msg);⓪"TimeConvert.TimeToText (Clock.UnpackTime (Puff^.tageszeit), '', str);⓪"Append (str, msg);⓪ END ZeitAnzeigen;⓪ ⓪ PROCEDURE CursorAufMauspos (Puff: einPufferPointer; bef: einTasteneintrag);⓪ VAR     n:              CARDINAL;⓪(xpos, ypos:     CARDINAL;⓪ BEGIN⓪"IF oldmy <= CharHeight * 3 (* in Statuszeile *)⓪$THEN RETURN;⓪"END;⓪"xpos := oldmx DIV CharWidth; ypos := oldmy DIV CharHeight - 2;⓪"WITH Puff^ DO⓪$MausAus; GotoXY (xpos, ypos);⓪$(* n wird die absolute Textzeile, daher Addition⓪'des Fensteroffsets >>ErsteZeile.zeilpos<< *)⓪$n := MerkPunkte [ErsteZeile].zeilpos + ypos;⓪$IF n > ZeilenAnzahl THEN n := ZeilenAnzahl; END;⓪ ⓪$(* Einstellen auf die Zeile mit gleichem Fensteroffset *)⓪$StelleZeileEin (Puff, n, n - MerkPunkte [ErsteZeile].zeilpos);⓪$⓪$(* Einstellen auf Charakter + seitlichem Scrolloffset *)⓪$MerkPunkte [LaufendeZeile].charpos := MerkPunkte [ErsteZeile].charpos +⓪;xpos;⓪$CASE bef.bef OF⓪&LeftMous:         MarkiereBlockAnfang (Puff); BlockWurdeMarkiert:= TRUE|⓪&RightMous:        MarkiereBlockEnde (Puff); BlockWurdeMarkiert:= TRUE|⓪&ELSE;⓪$END;⓪"END (* WITH *);⓪ END CursorAufMauspos;⓪ ⓪ PROCEDURE DoWeitSuch (Puff: einPufferPointer);⓪ VAR     gefunden:       BOOLEAN;⓪(ok:             BOOLEAN;⓪ BEGIN⓪"WITH Puff^ DO⓪$IF ~(suchwort [0] = nul) THEN⓪&GotoXY (0, 0); HighLight; LoescheZeile;⓪&WriteString (0, suchwort);⓪&MausBusy;⓪&SucheWort (Puff, suchwort, gefunden, key);⓪&IF gefunden THEN⓪(WITH MerkPunkte [IndexListe] DO⓪*zeilpos := MerkPunkte [LaufendeZeile].zeilpos;⓪*merkline := MerkPunkte [LaufendeZeile].merkline;⓪*charpos := MerkPunkte [LaufendeZeile].charpos;⓪(END (* WITH *);⓪&ELSE⓪(Strings.Assign ('>>', Zeile, ok); Append (suchwort, Zeile);⓪(Strings.Append ('<<|nicht gefunden!', Zeile, ok);⓪(Nachricht (Zeile);⓪&END (* IF ~gefunden *);⓪&Normal;⓪$END (* IF *);⓪"END (* WITH *);⓪ END DoWeitSuch;⓪ ⓪ PROCEDURE DoTextLoad (VAR Puff: einPufferPointer; termch: einTasteneintrag;⓪(VAR Info: ARRAY OF CHAR);⓪ VAR     helpPuff:       einPufferPointer;⓪ BEGIN⓪"WITH Puff^ DO⓪$helpPuff := FindeLeerpuffer (Puff);⓪$IF helpPuff # NIL THEN⓪&Puff := helpPuff;⓪&SchirmSchreiben (Puff,⓪*Puff^.MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪&Puff := helpPuff;⓪&TextLesen (Puff, TRUE, TRUE, TRUE, TRUE);⓪0(* KonfigSpeichern IN ConfigPuffer^.Modus);*)⓪&IF ~PufferLeer (Puff) THEN⓪(Assign (helpPuff^.Pfad, Info); DeleteTail (Info);⓪(Append (helpPuff^.Name, Info);⓪(Puff := helpPuff;⓪&END (* IF Puffer leer *);⓪&tabjump := TabWeite;⓪&SchirmSchreiben (Puff,⓪(MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪$END (* IF *);⓪"END (* WITH *);⓪ END DoTextLoad;⓪ ⓪ PROCEDURE DoNaechsterMerker (Puff: einPufferPointer;⓪=VAR infozeile: ARRAY OF CHAR);⓪ VAR     mp:     einMerkPointer;⓪ BEGIN⓪"WITH Puff^.MerkPunkte [CompilerInfo] DO⓪$StellePointerEin (Puff, merkline, LinesOnScreen DIV 2);⓪$Puff^.MerkPunkte [LaufendeZeile].charpos := charpos;⓪$GetLine (merkinfo, infozeile);⓪"END (* WITH *);⓪"WITH Puff^ DO⓪$WITH MerkPunkte [LaufendeZeile] DO⓪&IF (charpos > MerkPunkte [ErsteZeile].charpos + CharsInLine) OR⓪)(charpos < MerkPunkte [ErsteZeile].charpos) THEN⓪(CheckMargin (Puff);⓪&END (* IF *);⓪$END (* WITH *);⓪"END (* WITH Puff^ *);⓪ END DoNaechsterMerker;⓪ ⓪ PROCEDURE Editieren (Puff: einPufferPointer;⓪5VAR RetPuff: einPufferPointer;⓪5VAR termch: einTasteneintrag;⓪5infozeile: ARRAY OF CHAR;⓪5Level: CARDINAL);⓪ VAR    restlaenge:              CARDINAL;⓪'n, mz:                   CARDINAL;⓪'ml:                      einLinePointer;⓪'shift:                   BOOLEAN;⓪'overflow:                BOOLEAN;⓪'marginoverflow:          BOOLEAN;⓪'Indent:                  BOOLEAN;⓪'Inf, Info:               eineInfo;⓪'AlterPfad, AlterName:    eineInfo;⓪'ch:                      CHAR;⓪'helpInfo:                eineInfo;⓪ ⓪'helpPuff:                einPufferPointer;⓪!⓪ VAR     dummy:          CHAR;⓪(gefunden:       BOOLEAN;⓪(gotoX, gotoY:   CARDINAL;⓪(Z:              eineInfo;⓪ ⓪"PROCEDURE Vorlauf (Puff: einPufferPointer);⓪"VAR   l, ll:          CARDINAL;⓪(loescheBlanks:  BOOLEAN;⓪(ok:             BOOLEAN;⓪"BEGIN⓪$EditPuffer := Puff;⓪$WITH Puff^ DO⓪&⓪&(* *** Anzeige der Kopfzeile: *** *)⓪&Assign (Pfad, Inf); DeleteTail (Inf);⓪&Append (Name, Inf);⓪&IF Editiert IN Modus THEN Strings.Append (' !', Inf, ok); END;⓪&⓪&(* *** Zeileneditor aufrufen: *** *)⓪&MausPos (oldmx, oldmy, bewegt, Knoepfe);⓪&⓪&EXCL (Modus, Changed);⓪&IF (infozeile [0] = nul) THEN⓪(Edit (Puff, Zeile, TRUE, VollPrompt, Inf,⓪.overflow, marginoverflow,⓪.FALSE, oldmx, oldmy, termch);⓪.VollPrompt := FALSE;⓪&ELSE⓪(Edit (Puff, Zeile, FALSE, TRUE, infozeile,⓪.overflow, marginoverflow,⓪.FALSE, oldmx, oldmy, termch);⓪(infozeile [0] := nul; VollPrompt := TRUE;⓪&END (* IF *);⓪&⓪&(* *** Bearbeitete Textposition merken: *** *)⓪&IF (termch.TT = Befehl) & (termch.bef = RestoreCurrentLine) THEN⓪(IF ~(Changed IN Modus) THEN⓪*termch.bef := PopLastBufferLine;⓪(ELSE⓪*SchirmSchreiben (Puff, MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪*termch.bef := nothing;⓪(END;⓪&ELSIF Changed IN Modus THEN⓪(WITH MerkPunkte [LetztePosition] DO⓪*zeilpos := MerkPunkte [LaufendeZeile].zeilpos;⓪*charpos := MerkPunkte [LaufendeZeile].charpos;⓪*merkline := MerkPunkte [LaufendeZeile].merkline;⓪(END (* WITH *);⓪&⓪((* Zeile zurueckschreiben: *)⓪(PutLine (MerkPunkte [LaufendeZeile].merkline, Zeile);⓪(INCL (Modus, Editiert);⓪(EXCL (Modus, Compiliert);⓪&END (* IF changed *);⓪&(*⓪&IF (AutoCount >= SchreibZaehler) & (AutoSave IN Modus) THEN⓪(AutoCount := 0;⓪(TextSchreiben (Puff, FALSE, FALSE, FALSE, KonfigSpeichern IN Modus, FALSE);⓪(SchirmSchreiben (Puff, MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪9(*MerkPunkte [LaufendeZeile].zeilpos -⓪;MerkPunkte [ErsteZeile].zeilpos); *)⓪&END (* IF AutoCount *);⓪&*)⓪$END (* WITH *);⓪"END Vorlauf;⓪ ⓪ CONST   BrowseOff =     8; (* Mausabstand vom Schirmrand in Chars,⓪>um Browser statt Menue zu rufen *)⓪ VAR     mp, hp:         einMerkPointer;         (* Fuer MerkMenu *)⓪(mpt:            einMerkPunkt;⓪(ok:             BOOLEAN;⓪(vorherMarkiert: BOOLEAN;⓪(⓪ BEGIN (* Editieren *)⓪"VollPrompt := TRUE;⓪"WITH Puff^ DO⓪$EXCL (Modus, Changed);⓪$tabjump := TabWeite;⓪$IF ~(Exit IN Puff^.Modus) THEN⓪&SchirmSchreiben (Puff, Puff^.MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪$END (* IF *);⓪"END (* WITH *);⓪"REPEAT⓪$WITH Puff^ DO⓪&(* tabjump := TabWeite; *)⓪&IF (termch.bef = RollFLeft) OR (termch.bef = RollFRight) THEN⓪(scrolloffset := CharsInLine - TabWeite⓪&ELSE scrolloffset := TabWeite + TabWeite;⓪&END;⓪&Vorlauf (Puff);⓪&vorherMarkiert:= BlockWurdeMarkiert;⓪&BlockWurdeMarkiert:= FALSE;⓪&CASE termch.bef OF⓪(RollLeft, RollFLeft:  IF MerkPunkte [ErsteZeile].charpos > 0 THEN⓪5marginoverflow := TRUE;⓪5MerkPunkte [LaufendeZeile].charpos :=⓪7MerkPunkte [ErsteZeile].charpos - 1;⓪3END (* IF *);⓪(|⓪(RollRight, RollFRight:  IF MerkPunkte [ErsteZeile].charpos + CharsInLine <= Max THEN⓪6MerkPunkte [LaufendeZeile].charpos :=⓪7MerkPunkte [ErsteZeile].charpos + CharsInLine;⓪4ELSE MerkPunkte [LaufendeZeile].charpos := Max;⓪4END (* IF *);⓪4marginoverflow := TRUE;⓪(|⓪(ELSE;⓪&END (* CASE *);⓪&IF marginoverflow THEN⓪(CheckMargin (Puff);⓪(SchirmSchreiben (Puff, MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪&ELSE (* not overflow *)⓪!⓪(CASE termch.bef OF⓪*EditBlock:       Strings.Assign ('[***Blockpuffer***]', Inf, ok);⓪;EXCL (ClipBoard^.Modus, Exit);⓪;SchirmSchreiben (ClipBoard,⓪=MerkPunkte [ErsteZeile].merkline, 0, 0);⓪;Editieren (ClipBoard, helpPuff, key, Inf, 0);⓪;EditPuffer := Puff;⓪;VollPrompt := TRUE;⓪-|⓪*Seitup:          IF ((MerkPunkte [LaufendeZeile].zeilpos + 3) >⓪=LinesOnScreen) THEN⓪=StelleZeileEin (Puff,⓪MMerkPunkte [LaufendeZeile].zeilpos⓪M- LinesOnScreen + 3,⓪MMerkPunkte [LaufendeZeile].zeilpos⓪M- MerkPunkte [ErsteZeile].zeilpos);⓪;ELSE StelleZeileEin (Puff, 1, 0);⓪;END (* IF *);⓪;|⓪*cursup:          LineUp (Puff);|⓪*Seitdown:        StelleZeileEin (Puff,⓪KMerkPunkte [LaufendeZeile].zeilpos⓪K+ LinesOnScreen - 3,⓪KMerkPunkte [LaufendeZeile].zeilpos⓪K- MerkPunkte [ErsteZeile].zeilpos);⓪;|⓪*cursdown:        LineDown (Puff);⓪;|⓪*cursleft, ZeilAnf, DelBZeil,⓪*Wortleft:        IF MerkPunkte [LaufendeZeile].merkline^.vorige # Puffer THEN⓪=LineUp (Puff);⓪=MerkPunkte [LaufendeZeile].charpos :=⓪?Length (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);⓪;END (* IF *);⓪;|⓪*cursright, ZeilEnde, DelEZeil,⓪*Wortrigt:        IF MerkPunkte [LaufendeZeile].merkline^.naechste # NIL THEN⓪=LineDown (Puff);⓪=MerkPunkte [LaufendeZeile].charpos := 0;⓪;END (* IF *);⓪;VollPrompt := TRUE;⓪;|⓪*DelLChar,⓪*DelLWort:        DoBackspace (Puff);⓪;VollPrompt := TRUE;⓪;|⓪*DelRChar,⓪*DelRWort:        WITH MerkPunkte [LaufendeZeile] DO⓪=charpos := Length (merkline^.ZeilPointer^);⓪;END;⓪;DoDelete (Puff);⓪;VollPrompt := TRUE;⓪;|⓪*(* RETURN - Zeile spalten, neue Zeile einfuegen: *)⓪*return:          returnX := 1; DoCR (Puff, TRUE, returnX);⓪;VollPrompt := TRUE;⓪;|⓪*(* Undo-Puffer loeschen: *)⓪*LoeschUndo:      undone := FALSE;⓪;Loeschen (UndoPuffer);⓪;|⓪*(* Zeile in Puffer kopieren: *)⓪*PopCopyLine:     InsertLine (UndoPuffer,⓪=Puff^.MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^,⓪=FALSE, FALSE, FALSE);⓪;VollPrompt := TRUE;⓪;|⓪*(* Zeile loeschen - in Puffer schreiben: *)⓪*PopDeleteLine:   DeleteLine (Puff,⓪AMerkPunkte [LaufendeZeile].merkline,⓪CTRUE, TRUE);⓪;INCL (Modus, Editiert);⓪;EXCL (Modus, Compiliert);⓪;VollPrompt := TRUE;⓪;|⓪*(* Zeile aus Puffer bei Cursor in Text kopieren: *)⓪*PopLastBufferLine,⓪*CopyLastBufferLine: Indent := AutoIndent IN Modus;⓪;EXCL (Modus, AutoIndent);⓪;LineUp (Puff);⓪;InsertLine (Puff,⓪GUndoPuffer^.MerkPunkte⓪I[LaufendeZeile].merkline^.ZeilPointer^,⓪GFALSE, TRUE, TRUE);⓪;IF termch.bef = PopLastBufferLine THEN⓪=DeleteLine (UndoPuffer,⓪?UndoPuffer^.MerkPunkte [LaufendeZeile].merkline,⓪GFALSE, FALSE);⓪=LineUp (UndoPuffer);⓪;END (* IF *);⓪;IF Indent THEN INCL (Modus, AutoIndent); END;⓪;INCL (Modus, Editiert);⓪;EXCL (Modus, Compiliert);⓪;VollPrompt := TRUE;⓪;|⓪*(* Ueberschreiben/Einfuegen umschalten: *)⓪*indent:          IF AutoIndent IN Modus THEN⓪>EXCL (Modus, AutoIndent);⓪;ELSE INCL (Modus, AutoIndent);⓪;END (* IF *);⓪;VollPrompt := TRUE;⓪;|⓪*insert:          IF OverWrite IN Modus THEN⓪=EXCL (Modus, OverWrite);⓪;ELSE INCL (Modus, OverWrite);⓪;END (* IF *);⓪;VollPrompt := TRUE;⓪;|⓪*Grossklein:      IF GrossKleinSuche IN Modus THEN⓪>EXCL (Modus, GrossKleinSuche);⓪;ELSE INCL (Modus, GrossKleinSuche);⓪;END;⓪-|⓪*Wortsuche:       IF WortSuche IN Modus THEN⓪=EXCL (Modus, WortSuche);⓪;ELSE INCL (Modus, WortSuche);⓪;END;⓪-|⓪*(* Hilfspuffer anzeigen: *)⓪*help:            IF HilfsPuffer # NIL THEN⓪=EditPuffer := HilfsPuffer;⓪=HilfsPuffer := Puff;⓪=Puff := EditPuffer;⓪=VollPrompt := TRUE;⓪;END (* IF *);⓪;|⓪*(* Neuen Puffer anlegen: *)⓪*InsertPuff:      Puff := FindeLeerpuffer (Puff);⓪;IF ~PufferLeer (Puff) THEN⓪=Puff := InsertPuffer (Puff);⓪;END;⓪;VollPrompt := TRUE;⓪;|⓪*NaechstenPuffer: helpPuff := Puff;⓪;Puff := Puff^.NaechsterPuffer;⓪;tabjump := TabWeite;⓪;EditPuffer := Puff;⓪;VollPrompt := TRUE;⓪;|⓪*(* Bildschirm nach unten rollen: *)⓪*Rolldown:        ScrollDown (Puff, 1);⓪;|⓪*(* Bildschirm nach oben rollen: *)⓪*Rollup:          ScrollUp (Puff, 1);⓪;|⓪*(* Zum Textanfang springen: *)⓪*zumDAnf:         MerkPunkte [LaufendeZeile].merkline :=⓪=Puffer^.naechste;⓪;MerkPunkte [ErsteZeile].merkline :=⓪=MerkPunkte [LaufendeZeile].merkline;⓪;MerkPunkte [LaufendeZeile].zeilpos := 1;⓪;MerkPunkte [ErsteZeile].zeilpos := 0;⓪;MerkPunkte [LaufendeZeile].charpos := 0;⓪;VollPrompt := TRUE; (* Für alle Fälle... *)⓪;|⓪*(* Zum Textende springen: *)⓪*zumDEnde:        StelleZeileEin (Puff, ZeilenAnzahl + 1, LinesOnScreen);⓪;MerkPunkte [LaufendeZeile].charpos :=⓪=Length (MerkPunkte [LaufendeZeile].merkline^.ZeilPointer^);⓪;VollPrompt := TRUE;⓪;|⓪*(* Zur einer Zeilennummer springen: *)⓪*zuNrZeile:       n := 0;⓪;ReadNum (1, 'Zeilennummer: ', n);⓪;StelleZeileEin (Puff, n, LinesOnScreen DIV 2);⓪;VollPrompt := TRUE;⓪;|⓪*(* Linke Maustaste gedrueckt: *)⓪*(* LeftMous *)⓪*LeftMous, RightMous:        CursorAufMauspos (Puff, termch);⓪;|⓪*(* String suchen: *)⓪*SuchString:      tauschwort := '';⓪;WortSuchen (Puff, FALSE, suchwort);⓪;VollPrompt := TRUE;⓪;|⓪*(* Ganzes Wort auf Cursor suchen *)⓪*PickWort:        tauschwort := '';⓪;WortSuchen (Puff, TRUE, suchwort);⓪;VollPrompt := TRUE;⓪;|⓪*(* Wort noch einmal suchen oder/und austauschen: *)⓪*WeitSuch:        DoWeitSuch (Puff); VollPrompt := TRUE;⓪;|⓪*(* Wort suchen und tauschen: *)⓪*StriTausch:      SuchTauschen (Puff, FALSE, suchwort, tauschwort);⓪;VollPrompt := TRUE;⓪;|⓪*PickTausch:      SuchTauschen (Puff, TRUE, suchwort, tauschwort);⓪;VollPrompt := TRUE;⓪;|⓪*(* gepufferten Block an Cursorposition in Text kopieren: *)⓪*Kopier,⓪*Verschieb,⓪*Paste:           IF NOT BlockMarkiert (Puff) AND⓪>(termch.bef # Paste) THEN⓪=Nachricht ('Kein Block markiert!');⓪;ELSIF InBlockMarken (Puff)⓪;& (termch.bef = Verschieb) THEN⓪=Nachricht ('Verschieben ist hier |nicht möglich!');⓪;ELSE⓪=IF BlockMarkiert (Puff) AND⓪=((termch.bef # Paste) OR vorherMarkiert) THEN⓪?WITH MerkPunkte [LaufendeZeile] DO⓪Aml:= merkline;⓪An:= charpos;⓪AKopiereLoesche (Puff, ClipBoard,⓪Ctermch.bef # Paste, termch.bef # Kopier);⓪AIF termch.bef # Paste THEN⓪C(* Cursor zurücksetzen *)⓪CSucheZeilenNummer (Puff, ml, zeilpos);⓪Cmerkline:= ml;⓪Ccharpos:= n⓪AEND⓪?END⓪=END;⓪=LoescheBlockMarken (Puff);⓪=IF DoClipboard & (termch.bef = Paste) THEN⓪?EXCL (ClipBoard^.Modus, Editiert);⓪?LoeschePuffer (ClipBoard);⓪?Assign (ScrapPfad, ClipBoard^.Pfad);⓪?Assign (ScrapName, ClipBoard^.Name);⓪?TextLesen (ClipBoard, TRUE, FALSE, FALSE, FALSE);⓪=END;⓪=IF PufferLeer (ClipBoard) THEN⓪?Nachricht ('Es ist nichts|im Clipboard!');⓪=ELSE⓪?Kopiere (Puff, ClipBoard);⓪=END;⓪;END;⓪;VollPrompt := TRUE;⓪;|⓪*(* Markierten Block loeschen (oder kopieren) und puffern): *)⓪*CutToClipboard,⓪*DeleteBlock,⓪*CopyToClipboard: KopiereLoesche (Puff, ClipBoard,⓪=termch.bef # DeleteBlock,⓪=termch.bef # CopyToClipboard);⓪;IF (termch.bef # DeleteBlock) & DoClipboard THEN⓪=ClearScrap; (* Löscht alle "SCRAP.*"-Dateien im⓪J* Scrap-Ordner, falls er existiert.*)⓪=Assign (ScrapPfad, ClipBoard^.Pfad);⓪=Assign (ScrapName, ClipBoard^.Name);⓪=TextSchreiben (ClipBoard, FALSE, FALSE, FALSE, FALSE, FALSE, ok);⓪;END;⓪;LoescheBlockMarken (Puff); VollPrompt := TRUE;⓪;|⓪*(* Ganzen Puffer loeschen & entfernen: *)⓪*LoescheText:     IF (Editiert IN Puff^.Modus) THEN⓪=IF FrageJaNein (Ja, 'Text speichern?') THEN⓪?TextSchreiben (Puff, FALSE, FALSE, FALSE,⓪LKonfigSpeichern IN Modus, FALSE, ok);⓪=ELSIF⓪?FrageJaNein (Nein, 'Text ist editiert|Trotzdem löschen?') THEN⓪?EXCL (Modus, Editiert);⓪=END (* IF *);⓪;END (* IF Editiert *);⓪;IF ~(Editiert IN Puff^.Modus) THEN⓪=LoeschePuffer (Puff);⓪=DeletePuffer (Puff);⓪;END (* IF *);⓪;VollPrompt := TRUE;⓪;|⓪*(* Markierten Block saven *)⓪*BlockWrit:       TextSchreiben (Puff, FALSE, TRUE, TRUE, FALSE, FALSE, ok);⓪;IF ok THEN⓪=LoescheBlockMarken (Puff);⓪;END;⓪;VollPrompt := TRUE;⓪;|⓪*(* File als Block in Text einfuegen *)⓪*BlockRead:       AlterName := Puff^.Name;⓪;AlterPfad := Puff^.Pfad; (* DeleteTail (AlterPfad); *)⓪;TextLesen (Puff, FALSE, TRUE, FALSE, TRUE);⓪;Puff^.Name := AlterName; Puff^.Pfad := AlterPfad;⓪;VollPrompt := TRUE;⓪;|⓪*(* Datei sichern ohne Abfrage *)⓪*Update:          TextSchreiben (Puff, FALSE, FALSE, FALSE,⓪JKonfigSpeichern IN Modus, FALSE, ok);⓪;VollPrompt := TRUE;⓪;|⓪*(* Text speichern mit Abfrage *)⓪*TextSave:        TextSchreiben (Puff, FALSE, FALSE, TRUE,⓪JKonfigSpeichern IN Modus, FALSE, ok);⓪;VollPrompt := TRUE;⓪;|⓪*(* Datei laden *)⓪*TextLoad,⓪*TextFragLad:     DoTextLoad (Puff, termch, Info);⓪;EditPuffer := Puff; VollPrompt := TRUE;⓪;|⓪*(* Zum Blockanfang springen: *)⓪*zurAMark:        StelleZeileEin (Puff,⓪@MerkPunkte [BlockMarke1].zeilpos, 3);⓪;MerkPunkte [LaufendeZeile].charpos :=⓪=MerkPunkte [BlockMarke1].charpos;⓪;VollPrompt := TRUE;⓪;|⓪*(* Marke Blockanfang setzen: *)⓪*setAMark:        MarkiereBlockAnfang (Puff); BlockWurdeMarkiert:= TRUE⓪;|⓪*(* Zum Blockende springen: *)⓪*zurEMark:        StelleZeileEin (Puff,⓪KMerkPunkte [BlockMarke2].zeilpos,⓪KLinesOnScreen - 3);⓪;MerkPunkte [LaufendeZeile].charpos :=⓪=MerkPunkte [BlockMarke2].charpos;⓪;|⓪*(* Aufheben der Blockmarkierung: *)⓪*BlockMLoe:       LoescheBlockMarken (Puff);⓪;|⓪*(* Marke Blockende setzen: *)⓪*setEMark:        MarkiereBlockEnde (Puff); BlockWurdeMarkiert:= TRUE⓪;|⓪*SelectAll:       mpt:= MerkPunkte [LaufendeZeile];⓪;WITH MerkPunkte [LaufendeZeile] DO⓪=n:= 1;⓪=SucheZeilenPointer (Puff, n, merkline);⓪=zeilpos:= n; charpos := 0;⓪=MarkiereBlockAnfang (Puff);⓪=n:= ZeilenAnzahl;⓪=SucheZeilenPointer (Puff, n, merkline);⓪=zeilpos:= n;⓪=charpos := Length (merkline^.ZeilPointer^);⓪=MarkiereBlockEnde (Puff);⓪;END;⓪;BlockWurdeMarkiert:= TRUE;⓪;MerkPunkte [LaufendeZeile]:= mpt;⓪;VollPrompt := TRUE;⓪;|⓪*SelectLine:      LoescheBlockMarken (Puff);⓪;mpt:= MerkPunkte [LaufendeZeile];⓪;WITH MerkPunkte [LaufendeZeile] DO⓪=charpos := 0;⓪=MarkiereBlockAnfang (Puff);⓪=IF merkline^.naechste # NIL THEN⓪?merkline := merkline^.naechste;⓪?INC (zeilpos);⓪=ELSE⓪?charpos := Length (merkline^.ZeilPointer^);⓪=END;⓪=MarkiereBlockEnde (Puff);⓪;END;⓪;BlockWurdeMarkiert:= TRUE;⓪;MerkPunkte [LaufendeZeile]:= mpt;⓪;VollPrompt := TRUE;⓪;|⓪*SelectWord: (*   noch nicht impl *)⓪;|⓪*(* Block Einruecken: *)⓪*Einrueck:        RueckeBlockEin (Puff);⓪;VollPrompt := TRUE;⓪;|⓪*(* Zur ersten Sprungmarke springen: *)⓪*zur1Mark:        StelleZeileEin (Puff,⓪>MerkPunkte [MerkPunkt1].zeilpos,⓪>LinesOnScreen DIV 2);⓪;MerkPunkte [LaufendeZeile].charpos :=⓪=MerkPunkte [MerkPunkt1].charpos;⓪;|⓪*(* Erste Sprungmarke setzen: *)⓪*set1Mark:        WITH MerkPunkte [MerkPunkt1] DO⓪=zeilpos := MerkPunkte [LaufendeZeile].zeilpos;⓪=merkline := MerkPunkte [LaufendeZeile].merkline;⓪=charpos := MerkPunkte [LaufendeZeile].charpos;⓪;END (* WITH *);|⓪*(* Zur zweiten Sprungmarke springen: *)⓪*zur2Mark:        StelleZeileEin (Puff,⓪KMerkPunkte [MerkPunkt2].zeilpos,⓪KLinesOnScreen DIV 2);⓪;MerkPunkte [LaufendeZeile].charpos := MerkPunkte [MerkPunkt2].charpos;⓪;|⓪*zur3Mark:        StelleZeileEin (Puff,⓪KMerkPunkte [M13].zeilpos,⓪KLinesOnScreen DIV 2);⓪;MerkPunkte [LaufendeZeile].charpos := MerkPunkte [M13].charpos;⓪;|⓪*(* Zweite Sprungmarke setzen: *)⓪*set2Mark:        WITH MerkPunkte [MerkPunkt2] DO⓪=zeilpos := MerkPunkte [LaufendeZeile].zeilpos;⓪=merkline := MerkPunkte [LaufendeZeile].merkline;⓪=charpos := MerkPunkte [LaufendeZeile].charpos;⓪;END (* WITH *);|⓪*set3Mark:        WITH MerkPunkte [M13] DO⓪=zeilpos := MerkPunkte [LaufendeZeile].zeilpos;⓪=merkline := MerkPunkte [LaufendeZeile].merkline;⓪=charpos := MerkPunkte [LaufendeZeile].charpos;⓪;END (* WITH *);|⓪*(* Tabulator-Sprungweite einstellen: *)⓪*TabLaen:         ReadNum (1, 'Tabulatorabstand: ', TabWeite);⓪;tabjump := TabWeite;⓪;scrolloffset := TabWeite + TabWeite;⓪;MerkPunkte [LaufendeZeile].charpos := 0;⓪;MerkPunkte [ErsteZeile].charpos := 0;⓪;VollPrompt := TRUE;⓪;|⓪*(* Zur letzten bearbeiteten Position springen: *)⓪*LetztePos:       StelleZeileEin (Puff,⓪AMerkPunkte [LetztePosition].zeilpos,⓪ALinesOnScreen DIV 2);⓪;MerkPunkte [LaufendeZeile].charpos :=⓪=MerkPunkte [LetztePosition].charpos;⓪;|⓪*(* Zur letzten gesuchten Position springen: *)⓪*LetzteSuchPos:   StelleZeileEin (Puff,⓪AMerkPunkte [IndexListe].zeilpos,⓪ALinesOnScreen DIV 2);⓪;MerkPunkte [LaufendeZeile].charpos :=⓪=MerkPunkte [LetztePosition].charpos;⓪;|⓪*SteuerZeichenAnzeige:⓪;IF ControlZeichen IN Modus THEN⓪=EXCL (Modus, ControlZeichen)⓪;ELSE INCL (Modus, ControlZeichen);⓪;END;⓪;|⓪*TextParam:       IF KonfigSpeichern IN Modus THEN⓪=EXCL (Modus, KonfigSpeichern)⓪;ELSE INCL (Modus, KonfigSpeichern);⓪;END;⓪;|⓪*BackupAnlegen:   IF MakeBAK IN Modus THEN⓪=EXCL (Modus, MakeBAK)⓪;ELSE INCL (Modus, MakeBAK);⓪;END;⓪;|⓪*GEMKlemmbrettEinAus: DoClipboard := ~DoClipboard;⓪;|⓪*QueryError:      DoNaechsterMerker (Puff, infozeile);⓪;|⓪*Compile:         infozeile [0] := nul;⓪;SetCompilerInfo (Puff, infozeile); (* Löschen! *)⓪;CallCompiler (Puff, infozeile);⓪;CheckMargin (Puff);⓪;VollPrompt := TRUE;⓪;|⓪*ZeitUndDatum:    ZeitAnzeigen (Puff, infozeile);⓪;VollPrompt := TRUE;⓪;|⓪*GlobParam:       CopyConfig (Puff, ConfigPuffer);⓪;SaveConfig (ConfigPuffer, TRUE);⓪;|⓪*LoadParam:       LoadConfig (ConfigPuffer, TRUE, FALSE);⓪;|⓪*ELSE;⓪(END (* CASE *);⓪&END (* ELSE overflow *);⓪$END (* WITH *);⓪$⓪$IF (termch.TT = Befehl) & (termch.bef IN⓪&Befehlssatz {TextLoad, TextFragLad, WeitSuch, SuchString, PickWort,⓪3StriTausch, PickTausch, BlockMLoe, SelectLine,⓪3QueryError, KillPuff, NaechstenPuffer, InsertPuff,⓪3EditBlock, Seitup, GMECopyrightBox,⓪3Seitdown, help, PufferWaehlen, zumDAnf, zumDEnde, zuNrZeile,⓪3Lookup, LoadFiles,⓪3Compile, Make, MakeExec,⓪3CutToClipboard, CopyToClipboard,⓪3LoescheText, BlockWrit, BlockRead, TextSave,⓪3Update, zurAMark, zurEMark, zur1Mark, zur2Mark, zur3Mark,⓪3TabLaen, LetztePos, LetzteSuchPos,⓪3GlobParam, MerkPunkt, SetzPunkt, home})⓪$THEN⓪&SchirmSchreiben (Puff, Puff^.MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪&VollPrompt := TRUE;⓪$END;⓪"UNTIL (termch.TT = Befehl) & (termch.bef IN⓪$Befehlssatz {ExitEditor, QuitCompile, QuitCompileRun, Make, MakeExec,⓪-LoescheAllePuffer, SpeichereAllePuffer}) OR⓪((Exit IN Puff^.Modus);⓪"RetPuff := Puff;⓪ END Editieren;⓪ ⓪ BEGIN⓪"Trace ('EditLook');⓪"BindeSet := CharSet {0C, ' ', '-', PhantomTrenn};⓪"TrennSet := CharSet {0C, tab, ' ', ',', ';', '.', '(',⓪7')', '[', ']', '{', '}',⓪7':', '!', '/', '*', '-',⓪7'+', '&', '~', '=', (*'^',*)⓪7'#', '|', '<', '>'};⓪ ⓪"Trace ('Editor');⓪"BlockWurdeMarkiert:= FALSE;⓪"suchwort := ''; tauschwort := '';⓪"undone := FALSE;⓪ END GMEditor.⓪ ⓪ ⓪ ə
  2. (* $FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFEBA0DA$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4C$FFED7F4CÇ$00003277T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00002DD5$00008792$FFEB9790$0000319F$000031FE$000031E3$000031ED$000030FC$00002FF0$FFEB9790$00002F9A$FFEB9790$FFEB9790$000002F7$00003277$00008C0BÇÇé*)
  3.